﻿using System;

namespace Pisces
{
	/**
	 *  抽象的状态类
     * 此类型都作为单例存在，所以在状态里不要保存成员变量
     * created by wangqiang
    **/
	public abstract class AbstractFSMState<T, S> where S : Enum
	{
		/**
		 * 所属的状态枚举
		 */
		private S stateEnum;

		private AbstractFSMState()
		{
		}

		public AbstractFSMState(S state)
		{
			this.stateEnum = state;
		}

		public S StateEnum
		{
			get => stateEnum;
		}
		
		/**
		 * 获取超时时间,单位毫秒
		 * 0为永不超时
		 * @return
		 */
		public abstract int getTimeout();

		/**
		 * tick处理逻辑
		 * @param owner
		 * @param interval
		 */
		public abstract void tick(T owner, int interval);

		/**
		 * 是否可以转换到目标状态
		 * @param destination
		 * @return
		 */
		public abstract bool canTransitionTo(T owner, S destination);

		/**
		 * 进入状态
		 * @param owner
		 * @param source 源状态（从哪个状态切换过来）
		 */
		public abstract void enter(T owner, S source);

		/**
		 * 离开此状态
		 * @param owner
		 * @param destination 切换到的状态(下一个状态)
		 */
		public abstract void leave(T owner, S destination);

		/**
		 * 该状态超时
		 * @param owner
		 */
		public abstract void timeout(T owner);

		public override string ToString()
		{
			return "AbstractFSMState{" +
			       "stateEnum=" + stateEnum +
			       '}';
		}
		
	}
}